home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / FREENET / BRODIE / INTERNET / !InternetD / c / chargen < prev    next >
Text File  |  1995-06-07  |  2KB  |  81 lines

  1. #include "inetd.h"
  2.  
  3. #define CHARGENSIZE    76
  4.  
  5. void chargen_tcp(int s)
  6. {
  7.         int             t;
  8.         struct sockaddr_in    address;
  9.     int            size = sizeof(struct sockaddr_in);
  10.     inet_handler        *ih;
  11.  
  12.         t = accept(s, (struct sockaddr *)&address, &size);
  13.         if (t == -1) return;
  14.  
  15.     ih = worker_register(t, chargen_data, worker_io_write);
  16.     if (ih) {
  17.             ih->data.chargen.state = ' ';
  18.             ih->data.chargen.offset = 0;
  19.             if (ioctl(t, FIONBIO, 1) == -1) {
  20.                     syslog(0, "ioctl() failed for chargen/tcp");
  21.             }
  22.  
  23.     }
  24.     else {
  25.             kill_socket(&t);
  26.     }
  27. }
  28.  
  29. void chargen_udp(int s)
  30. {
  31.         struct    sockaddr_in    address;
  32.         int    size        = sizeof(struct sockaddr_in);
  33.     char            chargenbuff[CHARGENSIZE];
  34.     int    length;
  35.  
  36.  
  37.     length = recvfrom(s, chargenbuff, CHARGENSIZE, 0, (struct sockaddr *)
  38.         &address, &size);
  39.     if (length > 0) {
  40.         for (length=0; length<72; ++length) {
  41.                 chargenbuff[length] = 32+length;
  42.         }
  43.         chargenbuff[72] = '\r'; chargenbuff[73] = '\n';
  44.             sendto(s, chargenbuff, 74, 0, (struct sockaddr *)&address, size);
  45.     }
  46. }
  47.  
  48. /*---- the background I/O handler function ----*/
  49. void chargen_data(inet_handler *ih, worker_io_flags f)
  50. {
  51.         char    data[CHARGENSIZE];
  52.         int    result;
  53.     int    count, t;
  54.  
  55.     UNUSED(f);
  56.     t = ih->data.chargen.state;
  57.     for (count=0; count<72; ++count) {
  58.             data[count] = t++;
  59.             if (t == 127) t=' ';
  60.     }
  61.     data[72] = '\r'; data[73] = '\n';
  62.  
  63.         result = send(ih->data_socket, data+ih->data.chargen.offset,
  64.             74-ih->data.chargen.offset, 0);
  65.         if (result < 0) {
  66.                 if (errno != EWOULDBLOCK) {
  67.                         syslog(0,"chargen dying: %d %s", errno, socket_errno_to_string());
  68.                         worker_deregister(ih->data_socket);
  69.                 }
  70.         }
  71.         else {
  72.                 ih->data.chargen.offset += result;
  73.                 if (ih->data.chargen.offset >= 74) {
  74.                         ih->data.chargen.offset = 0;
  75.                     if (++ih->data.chargen.state == 127) {
  76.                             ih->data.chargen.state = ' ';
  77.                     }
  78.                 }
  79.         }
  80. }
  81.